home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsSTATS.rexx < prev    next >
OS/2 REXX Batch file  |  1995-01-25  |  11KB  |  452 lines

  1. /* $VER: bbsSTATS.rexx 8.4 (25.1.95)
  2. copyright ⌐ 1993-95 Richard Lee Stockton
  3.     - FREELY DISTRIBUTABLE -
  4. */
  5.  
  6. SIGNAL ON BREAK_C
  7. NUMERIC DIGITS 14
  8.  
  9. PARSE SOURCE . . . prg .
  10. ADDRESS AREXX Increment.rexx prg
  11.  
  12. CR=''
  13. def=''
  14. pen2=''
  15. pen3=''
  16. lineup='1B'x'M'
  17.  
  18. PARSE ARG name colorflag nonstop emailonline grand grand2 filesonline users .
  19.  
  20. IF colorflag~=1 THEN
  21.   DO
  22.     def=''
  23.     pen2=''
  24.     pen3=''
  25.   END
  26. IF ADDRESS()='BAUD' THEN CR='0D'x
  27. IF filesonline='' THEN
  28.   DO
  29.     x=STRIP(GETCLIP('BBS_statsarg'))
  30.     CALL SETCLIP('BBS_statsarg')
  31.     IF x='' THEN
  32.       DO
  33.         filesonline='?'
  34.         IF emailonline='' THEN emailonline='?'
  35.       END
  36.     ELSE PARSE VAR x emailonline grand grand2 filesonline .
  37.   END
  38. IF grand='GRAND' | grand='' THEN grand='?'
  39.  
  40. figarg='s:CONFIG.BBS'
  41. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  42. x=OPEN(f,figarg,'R')
  43. IF x=0 THEN
  44.   DO
  45.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  46.     EXIT 21
  47.   END
  48. lynes.=''
  49. DO i=1 TO 33
  50.   lynes.i=READLN(f)
  51. END
  52. CALL CLOSE(f)
  53.  
  54. compos=POS('/*',lynes.1)
  55. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  56. bbsname = STRIP(lynes.1)
  57. sysop=WORD(lynes.2,1)
  58. bbsdevice=WORD(lynes.4,1)
  59. sysoplevel=WORD(lynes.5,1)
  60. bbspath=WORD(lynes.6,1)
  61. IF ~EXISTS(bbspath) THEN
  62.   DO
  63.     SAY bbspath 'does not exist!'
  64.     EXIT 22
  65.   END
  66. testchar=RIGHT(bbspath,1)
  67. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  68. SYSTEM_SPACE_LIMIT=WORD(lynes.12,1)
  69. IF WORD(lynes.25,1)=1 THEN scratch=bbspath'Scratch'
  70. ELSE scratch='RAM:Scratch'
  71.  
  72. x=OPEN(f,bbspath'Users/'name,'R')
  73. IF x=0 THEN
  74.   DO
  75.     CALL DELAY(150)
  76.     x=OPEN(f,bbspath'Users/'name,'R')
  77.     IF x=0 THEN
  78.       DO
  79.         SAY name 'user file is missing!'
  80.         EXIT 23
  81.       END
  82.   END
  83. data.=''
  84. DO i=1 TO 25
  85.   data.i=READLN(f)
  86. END
  87. CALL CLOSE(f)
  88. lpp=data.7%1
  89. IF CR='' THEN lpp=20
  90. level=data.20%1
  91. lastread.=0
  92.  
  93. IF nonstop='' THEN
  94.   DO
  95.     nonstop=1
  96.     CALL CLOSE(STDOUT)
  97.     CALL OPEN(STDOUT,bbspath'EmailFiles/'name'/Notices/STATS.BBS','W')
  98.   END
  99.  
  100. x=GETCLIP('BBS_'name'_22')
  101. IF x~='' THEN
  102.   DO
  103.     data.22=x
  104.     CALL SETCLIP('BBS_'name'_22')
  105.   END
  106.  
  107. SAY GETCLIP('BBS_copyright')||CR
  108. CALL SETCLIP('BBS_copyright')
  109.  
  110. IF grand2='GRAND2' | grand2='' THEN
  111.   DO
  112.     grand2=0
  113.     DO i=1 TO 99
  114.       grand2=grand2+countcheck('Numbers/LastMessage'i 0)
  115.     END
  116.   END
  117.  
  118. prevcaller=GETCLIP('BBS_prevcaller')
  119. IF prevcaller~='' THEN
  120.   DO
  121.     SAY 'The previous'pen3 bbsname def'user was:'CR
  122.     SAY ' 'prevcaller||CR
  123.     SAY '  logged off at:' GETCLIP('BBS_userlogoff')||CR
  124.     SAY pen3'Last disconnect:'def GETCLIP('BBS_disconnect')||CR
  125.   END
  126. SAY CR
  127. day1='01'
  128. IF readopen(bbspath'Numbers/FirstLogon') THEN
  129.   DO
  130.     line=READLN(f)
  131.     CALL CLOSE(f)
  132.     SAY 'The First Logon to'pen3 bbsname def'was' line'.'CR
  133.     PARSE VAR line .' 'day1'-'.
  134.   END
  135. IF day1<10 & LENGTH(day1)<2 THEN day1='0'day1
  136. SAY '     Your sysop is' pen3||sysop||def||CR
  137. SAY CR
  138. usagelist=SHOWDIR(bbspath'Usage','F')
  139. tempnum=FIND(usagelist,'USER.LOG')
  140. IF tempnum>0 THEN usagelist=DELWORD(usagelist,tempnum,1)
  141. usagelist=sortnumbers(usagelist)
  142. SAY pen3'             - Total BBS Usage -'def||CR
  143. DO i=1 TO WORDS(usagelist)
  144.   dateclip=STRIP(WORD(usagelist,i))
  145.   usageclip=countcheck('Usage/'dateclip 0)
  146.   usageclp=usageclip%60 usageclip//60
  147.   mtime=30*23*60  /* we guess 1 hour a day for various maintenance */
  148.   IF i=1 THEN
  149.     DO
  150.       mtime=mtime-(day1-1)*23*60
  151.       day1=dateclip||day1
  152.     END
  153.   ELSE IF LEFT(DATE('S'),6)=dateclip THEN mtime=WORD(DATE(),1)*23*60
  154.   dateclip=dateclip'01'
  155.   line=RIGHT(DATE('M',dateclip,'S'),10) WORD(DATE(,dateclip,'S'),3)':'
  156.   line=line RIGHT(WORD(usageclp,1),3) 'hours' RIGHT(WORD(usageclp,2),2)
  157.   line=line 'minutes  = ' RIGHT(((usageclip*100)/mtime+.5)%1,2)'% usage.'
  158.   SAY line||CR
  159.   IF (i+12)//(lpp-3)=0 THEN
  160.     IF waiting2() THEN LEAVE i
  161. END
  162. cmin=countcheck('Numbers/Minutes' 0)
  163. chr=cmin%60
  164. cmin=cmin//60
  165. hrz=chr
  166. daz=1
  167. IF hrz<1 THEN hrz=1
  168. IF day1>19900101 THEN
  169.   DO
  170.     daz=1+DATE('I')-DATE('I',day1,'S')
  171.     hrz=daz*24
  172.   END
  173. SAY CR
  174. SAY '     Total Connect Time Since First Logon [all users]:'CR
  175. SAY RIGHT(comma(chr),20) 'hours' RIGHT(cmin,2) 'minutes  = ' RIGHT(((chr*100)/hrz+.5)%1,2)'% usage.'CR
  176. calls=countcheck('Numbers/Calls' 0)
  177. IF calls<1 THEN calls=1
  178. SAY RIGHT(comma(calls),20) 'completed calls.' RIGHT(TRUNC((calls/daz)+.05,1),8) 'calls per day.'CR
  179. SAY CR
  180. calz.=''
  181. CALL FileList(bbspath'Numbers/Calls?*',calz,'F','N')
  182. calz.0.0=0
  183. calz.0.1=0
  184. calz.0.2=0
  185. DO i=1 TO calz.0
  186.   calz.i.0=countcheck('Numbers/'calz.i 0)
  187.   calz.i.2=SUBSTR(calz.i,6)
  188.   calz.0.0=calz.0.0+calz.i.0
  189.   calz.i.1=countcheck('Numbers/Minutes'calz.i.2 0)
  190.   calz.0.1=calz.0.1+calz.i.1
  191. END
  192. SAY LEFT('',19) pen2'baudrate   calls  minutes'def||CR
  193. SAY LEFT('',19) pen2'--------  ------  -------'def||CR
  194. used=''
  195. DO j=1 TO calz.0
  196.   hi=0
  197.   DO i=1 TO calz.0
  198.     IF calz.i.2>calz.hi.2 & FIND(used,calz.i.2)=0 THEN hi=i
  199.   END
  200.   IF hi>0 THEN
  201.     DO
  202.       used=used calz.hi.2
  203.       temp=RIGHT(calz.hi.2,27) RIGHT(TRUNC(((calz.hi.0*100)/calz.0.0+.005),2),7)'%'
  204.       temp=temp                RIGHT(TRUNC(((calz.hi.1*100)/calz.0.1+.005),2),7)'%'
  205.       SAY temp||CR
  206.     END
  207. END
  208. SAY CR
  209. CALL waiting2()
  210. IF waitchar='Q' THEN RETURN
  211. CALL bbsspace(15)
  212. SAY CR
  213. IF extdevs~='' THEN CALL showxdevs()
  214. SAY RIGHT(comma(countcheck('Numbers/Bytes.DownLoad' 0)),15) 'bytes  in' RIGHT(comma(countcheck('Numbers/Files.DownLoad' 0)),7) 'files downloaded.'CR
  215. SAY CR
  216. SAY RIGHT(comma(countcheck('Numbers/Bytes.UpLoad' 0)),15) 'bytes uploaded.'CR
  217. SAY RIGHT(comma(filesonline),15) 'online of' RIGHT(comma(countcheck('Numbers/LastFile' 0)),7) 'public files.'CR
  218. IF emailonline<0 THEN CALL countmail()
  219. SAY RIGHT(comma(emailonline),15) 'online of' RIGHT(comma(countcheck('Numbers/LastMail' 0)),7) 'private messages.'CR
  220. SAY RIGHT(comma(grand),15) 'online of' RIGHT(comma(grand2),7) 'public messages.'CR
  221. IF users<1 THEN
  222.   DO
  223.     IF OPEN(f,bbspath'Lists/USERS','R')=0 THEN
  224.       users=WORDS(SHOWDIR(bbspath'USERS','F'))
  225.     ELSE
  226.       DO
  227.         users=0
  228.         DO i=1
  229.           dat.i=READCH(f,65000)
  230.           IF EOF(f) THEN LEAVE i
  231.           users=users+WORDS(dat.i)
  232.         END
  233.         CALL CLOSE(f)
  234.       END
  235.   END
  236. SAY RIGHT(comma(users),15) 'active of' RIGHT(comma(countcheck('Numbers/Users' 0)),7) 'user applications.'CR
  237. SAY RIGHT(comma(countcheck('Numbers/QUICKIN' 0)),15) 'QUICKIN &' RIGHT(comma(countcheck('Numbers/QUICKOUT' 0)),7) 'QUICKOUT files processed.'CR
  238. SAY CR
  239. SAY 'Your access level is 'level'  -  minimum sysop level is' sysoplevel||CR
  240. SAY CR
  241. SAY '  You Have'CR
  242. totmail=WORD(data.17,2)
  243. IF ~DATATYPE(totmail,'W') THEN totmail=0
  244. totmsg=0
  245. DO ti=1 TO level
  246.   temp=WORD(data.23,ti)
  247.   IF DATATYPE(temp,'W') THEN totmsg=totmsg+WORD(data.23,ti)
  248. END
  249. SAY '   Written' RIGHT(comma(totmsg),14)'  public &' RIGHT(comma(totmail),8)'  private messages.'CR
  250. totfiles=WORD(data.14,1)
  251. IF ~DATATYPE(totfiles,'W') THEN totfiles=0
  252. totbytes=WORD(data.14,3)
  253. IF ~DATATYPE(totbytes,'W') THEN totbytes=0
  254. SAY '  Uploaded' RIGHT(comma(totbytes),14)'  bytes in' RIGHT(comma(totfiles),8)'  files.'CR
  255. totfiles=WORD(data.15,1)
  256. IF ~DATATYPE(totfiles,'W') THEN totfiles=0
  257. totbytes=WORD(data.15,3)
  258. IF ~DATATYPE(totbytes,'W') THEN totbytes=0
  259. SAY 'Downloaded' RIGHT(comma(totbytes),14)'  bytes in' RIGHT(comma(totfiles),8)'  files.'CR
  260. PARSE VAR data.19 dhour' hours 'dmin' minutes in 'calls .
  261. IF ~DATATYPE(dhour,'W') THEN dhour=0
  262. IF ~DATATYPE(dmin,'W') THEN dmin=0
  263. IF ~DATATYPE(calls,'W') THEN calls=0
  264. SAY '..and been on' bbsname dhour 'hours' dmin+TIME('E')%60 'minutes in' calls+1 'calls.'CR
  265.  
  266. BREAK_C:
  267. EXIT
  268.  
  269.  
  270. waiting2:
  271. IF nonstop=1 THEN RETURN 0
  272. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  273. IF waitchar='N' THEN
  274.   DO
  275.     nonstop=1
  276.     waitchar=''
  277.   END
  278. CALL cleanline(1)
  279. IF waitchar='Q' THEN RETURN 1
  280. RETURN 0
  281.  
  282.  
  283. cleanline:
  284. ARG lflag .
  285. IF colorflag~=1 & lflag=1 THEN RETURN
  286. cline=lineup||LEFT(' ',78)
  287. IF lflag=1 THEN cline=cline||lineup
  288. SAY cline||CR
  289. RETURN
  290.  
  291.  
  292. getinput:
  293. PARSE ARG upflag' 'oneflag' 'pline
  294. OPTIONS PROMPT pline
  295. PARSE PULL inarg
  296. inarg=STRIP(inarg)
  297. IF upflag THEN inarg=UPPER(inarg)
  298. IF oneflag THEN inarg=LEFT(inarg,1)
  299. RETURN inarg
  300.  
  301.  
  302. countcheck:
  303. PARSE ARG fname' 'cknum .
  304. fname=bbspath||fname
  305. IF ~EXISTS(fname) THEN
  306.   DO
  307.     IF cknum=0 THEN RETURN 0
  308.     IF ~writeopen(fname) THEN RETURN 0
  309.     CALL WRITELN(f,cknum)
  310.     CALL CLOSE(f)
  311.     RETURN cknum
  312.   END
  313. IF ~readopen(fname) THEN RETURN cknum
  314. retval=STRIP(READLN(f))
  315. CALL CLOSE(f)
  316. IF ~DATATYPE(retval,'W') THEN retval=0
  317. IF ~DATATYPE(cknum,'W') THEN cknum=0
  318. IF retval<cknum THEN
  319.   DO
  320.     IF writeopen(fname) THEN
  321.       DO
  322.         CALL WRITELN(f,cknum)
  323.         CALL CLOSE(f)
  324.         RETURN cknum
  325.       END
  326.   END
  327. RETURN retval
  328.  
  329.  
  330. readopen:
  331. PARSE ARG fname
  332. ok=OPEN(f,fname,'R')
  333. IF ok~=0 THEN RETURN 1
  334. SAY fname 'failed to open for reading!'CR
  335. RETURN 0
  336.  
  337.  
  338. writeopen:
  339. PARSE ARG fname
  340. CALL CLOSE(f)
  341. ok=OPEN(f,fname,'W')
  342. IF ok~=0 THEN RETURN 1
  343. SAY fname 'failed to open for writing!'CR
  344. RETURN 0
  345.  
  346.  
  347. comma: PROCEDURE
  348. ARG num .
  349. dgt=LENGTH(num)
  350. numtext=''
  351. IF dgt>3 THEN numtext=','RIGHT(num,3)
  352. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  353. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  354. IF dgt>12 THEN
  355.   DO
  356.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  357.     numtext=LEFT(num,dgt-12)||numtext
  358.   END
  359. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  360. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  361. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  362. ELSE numtext=num
  363. RETURN numtext
  364.  
  365.  
  366. sortnumbers:
  367. PARSE ARG slist
  368. IF STRIP(slist)='' THEN RETURN ''
  369. sorted.=''
  370. oldest=999999
  371. newest=0
  372. newlist=''
  373. DO si=1 TO WORDS(slist)
  374.   testword=WORD(slist,si)
  375.   IF ~DATATYPE(testword,'W') THEN
  376.     DO
  377.       testpos=LASTPOS('.',testword)
  378.       IF testpos>0 THEN tempnum=SUBSTR(testword,testpos+1)
  379.       ELSE
  380.         DO
  381.           newlist=testword newlist
  382.           ITERATE si
  383.         END
  384.     END
  385.   ELSE tempnum=testword/1
  386.   IF sorted.tempnum='' THEN
  387.     DO
  388.       sorted.tempnum=testword
  389.       sorted.tempnum.0=1
  390.       IF DATATYPE(tempnum,'W') THEN
  391.         DO
  392.           IF tempnum>newest THEN newest=tempnum
  393.           IF tempnum<oldest THEN oldest=tempnum
  394.         END
  395.     END
  396.   ELSE newlist=newlist testword
  397. END
  398. IF oldest~=999999 & newest~=0 THEN
  399.   DO si=oldest TO newest
  400.     IF sorted.si.0=1 THEN newlist=newlist sorted.si
  401.   END
  402. DROP sorted. oldest newest
  403. RETURN STRIP(newlist)
  404.  
  405.  
  406. bbsspace:
  407. ARG tabspace .
  408. ADDRESS COMMAND 'C:info >'scratch'/infout' bbsdevice
  409. ok=OPEN(f,scratch'/infout','R')
  410. IF ok=0 THEN RETURN 20
  411. line=READLN(f)
  412. line=READLN(f)
  413. line=READLN(f)
  414. line=READLN(f)
  415. CALL CLOSE(f)
  416. IF tabspace<14 THEN SAY CR
  417. bbsk=WORD(line,4)
  418. IF ~DATATYPE(bbsk,'N') THEN
  419.   DO
  420.     line=bbsdevice 'is not an info compatible device!'
  421.     SAY pen3||line||def||CR
  422.     bbsk=0
  423.     RETURN
  424.   END
  425. bbsk=bbsk*512-SYSTEM_SPACE_LIMIT
  426. IF bbsk<1 THEN bbsk=0
  427. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'CR
  428. RETURN
  429.  
  430.  
  431. showxdevs: PROCEDURE EXPOSE bbspath pen3 def CR 
  432. CALL FileList(bbspath'Numbers/Files.X.*',xfiles,'F','N')
  433. IF xfiles.0>1 THEN CALL QSORT(1,xfiles.0,xfiles)
  434. DO i=1 TO xfiles.0
  435.   ii=LASTPOS('FILES.X.',UPPER(xfiles.i))+8
  436.   temp=SUBSTR(xfiles.i,ii)
  437.   SAY RIGHT(comma(countcheck('Numbers/Bytes.X.'temp 0)),15) 'bytes  in' RIGHT(comma(countcheck('Numbers/Files.X.'temp 0)),7)' files downloaded from' pen3||temp||def||CR
  438. END
  439. SAY LEFT('-',74,'-')||CR
  440. RETURN
  441.  
  442.  
  443. countmail:
  444. SAY '   Counting online email...'lineup||CR
  445. emailonline=0
  446. DO ti=1 TO WORDS(userlist)
  447.   emailonline=emailonline+WORDS(SHOWDIR(bbspath'Email/'WORD(userlist,ti)))
  448. END
  449. RETURN
  450.  
  451. /* bbsSTATS.rexx */
  452.